package com.chenjt.jvm.first.nine_String;

/**
 * 注释：
 * 如何保证变量s指向的是字符串常量池的数据呢？
 * 方式一：String s = "chenjt";// 字面量定义的方式
 * 方式二：调用intern()
 *        String s = new String("chenjt").intern();
 *        String s = new StringBuilder("chenjt").toString().intern();
 *
 * @author chenjt
 * @date 2025/6/13 11:33
 */
public class StringIntern {


    public static void main(String[] args) {
        String s = new String("1");
        // 调用此方法之前，字符串常量池中已经存在"1"
        s.intern();
        // s2指向的是常量池中的"1"，而s是堆空间中的地址
        String s2 = "1";
        // jdk6: false  jdk7/8：false
        System.out.println(s == s2);

        /**
         * s3变量记录的地址为：new String("11")
         * 执行完下一行代码以后（String s3 = new String("1") + new String("1");），
         * 字符串常量池中是否存在"11"？
         * 答案：不存在！！！
         */
        String s3 = new String("1") + new String("1");
        /**
         * s3.intern()执行以后，字符串常量池中会出现"11"
         * 理解：
         * jdk6：创建了一个新的对象"11"，也就有新的地址
         * jdk7/8：此时常量池中并没有创建"11"，而是在常量池中创建了
         *       一个指向堆空间中new String("11")的地址
         */
        s3.intern();
        // s4变量记录的地址：使用的是上一行代码执行时，在常量池中生成的"11"的地址
        String s4 = "11";
        // jdk6: false  jdk7/8：true
        System.out.println(s3 == s4);

    }



}
